/// 引力常数 N*m^2/kg^2
pub const GRAVITY: f64 = 6.67259e-11;

/// 引力计算\
/// m1与m2为物体质量 单位kg\
/// r为物体间的距离 单位米\
/// 结果为引力 F 单位牛顿 N 即 kg*m/s^2
pub fn gravitation(m1: f64, m2: f64, r: f64) -> f64 {
    if r == 0.0 {
        return 0.0;
    }
    GRAVITY * ((m1 * m2) / (r * r))
}

/// 空气阻力运算\
/// c 空气阻力系数\
/// d 空气密度 g/L == kg/m^3\
/// s 迎风面积 m^2\
/// v 相对运动速度 m/s\
/// 返回阻力 N
pub fn air_friction(c: f64, d: f64, s: f64, v: f64) -> f64 {
    (c * d * s * v * v) / 2.0
}

/// 空气密度\
/// p 空气压力 Pa\
/// r 气体常数 J/(kg*k)\
/// t 绝对温度 K (-273.15)\
/// 返回密度 kg/m^3 == g/L
pub fn air_density(p: f64, r: f64, t: f64) -> f64 {
    if p == 0.0 || t == 0.0 {
        return 0.0;
    }
    p / (r * t)
}

/// 牛顿第二定律\
/// f 力 m 质量 a 加速度
/// f N m kg a m/s^2
pub struct NewtonSecondLow;

impl NewtonSecondLow {
    pub fn calculate_speed(f: f64, m: f64) -> f64 {
        f / m
    }

    pub fn calculate_force(m: f64, a: f64) -> f64 {
        m * a
    }

    pub fn calculate_mass(f: f64, a: f64) -> f64 {
        f / a
    }
}